package publish.subscribe.consumer;

import com.rabbitmq.client.*;
import constant.Constants;

import java.io.IOException;
import java.util.concurrent.TimeoutException;

/**
 * Created with IntelliJ IDEA.
 * Description：实现 RabbitMQ 的 订阅模式 客户端 -- 消费者
 *
 * @author: zxj
 * @date: 2024-09-18
 * @time: 15:23:47
 */
public class RabbitConsumer1 {
    public static void main(String[] args) throws IOException, TimeoutException {
        // 1. 创建工厂
        ConnectionFactory factory = new ConnectionFactory();
        // 2. 设置参数
        factory.setHost(Constants.HOST);
        factory.setPort(Constants.PORT);
        factory.setVirtualHost(Constants.VIRTUAL_HOST);
        factory.setUsername(Constants.USERNAME);
        factory.setPassword(Constants.PASSWORD);
        // 3. 创建链接
        Connection connection = factory.newConnection();
        // 4. 创建 channel
        Channel channel = connection.createChannel();
        // 5. 声明队列
        channel.queueDeclare(Constants.FANOUT_QUEUE1,true,false,false,null);
        // 6. 消费消息
        DefaultConsumer consumer = new DefaultConsumer(channel) {
            /*
             * 回调⽅法, 当收到消息后, 会⾃动执⾏该⽅法
             * 1. consumerTag: 标识
             * 2. envelope: 获取⼀些信息, 交换机, 路由key
             * 3. properties:配置信息
             * 4. body:数据
             **/
            @Override
            public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
                System.out.println("接收到数据: " + new String(body));
            }
        };
        /*
         * String basicConsume(
         * String queue,队列名
         * boolean autoAck, 是否自动应答
         * Consumer callback 回调对象, 接收到消息就会调用该对象里面的方法
         * )
         **/
        channel.basicConsume(Constants.FANOUT_QUEUE1,true,consumer);

        // 7. 关闭资源, 消费者相当于是⼀个监听程序, 不需要关闭资源
        // channel.close();
        // connection.close();
    }
}
